package com.atguigu.spzx.manager.service.impl;

import cn.hutool.core.date.DateTime;
import com.atguigu.spzx.common.exp.GuiguException;
import com.atguigu.spzx.manager.properties.SpzxMinioProperties;
import com.atguigu.spzx.manager.service.FileUploadService;
import com.atguigu.spzx.model.vo.common.ResultCodeEnum;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.UUID;

@Service
public class FileUploadServiceImpl implements FileUploadService {

    @Autowired
    SpzxMinioProperties spzxMinioProperties;
    @Override
    public String upload(MultipartFile file) {
        try {
            String originalFilename = file.getOriginalFilename();//客户端本地选择的文件的原文件名（1.png）
            InputStream inputStream = file.getInputStream();//文件输入流

            //图片上传，如果所选择的文件非图片类型、抛出异常
            if( !originalFilename.endsWith(".jpg") && !originalFilename.endsWith(".png") ){
                throw new GuiguException(ResultCodeEnum.FILE_TYPE_ERROR);
            }

            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(spzxMinioProperties.getEndpoint())
                            .credentials(spzxMinioProperties.getUsername(), spzxMinioProperties.getPassword())
                            .build();
            //joda-time 使用这个组件生成一个 yyyy/MM/dd  格式的字符串
            //每天的图片文件归档存储
            String objectName =  new DateTime().toString("yyyy/MM/dd") +  "/" + UUID.randomUUID().toString().replaceAll("-","")+originalFilename;

            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(spzxMinioProperties.getBucketName()) //指定你的文件要上传到哪个bucket中
                            .object(objectName) // 例如：  目录/文件名.xxx   ,  2024/02/23/1.jpg
                            .stream(inputStream, inputStream.available(), -1)
                            .contentType(  originalFilename.endsWith(".png")?"image/png":"image/jpeg") //文件类型 ， 不同格式的数据有不同的contentType  ， jpg ==》  image/jpeg
                            .build());

            String url = spzxMinioProperties.getEndpoint() + "/"+ spzxMinioProperties.getBucketName() +"/" + objectName;

            return url;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}

